//! 工作量证明模块 - 实现挖矿算法
use serde::{Serialize, Deserialize};
use crate::block::Block;

/// 工作量证明算法控制器
//#[derive(Debug, Clone)]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProofOfWork {
    /// 挖矿难度（哈希前导零的数量）
    pub difficulty: usize,
}

impl ProofOfWork {
    /// 创建新的PoW实例
    pub fn new(difficulty: usize) -> Self {
        ProofOfWork { difficulty }
    }

    /// 执行挖矿计算（修改nonce直到找到有效哈希）
    /// # 参数
    /// - block: 待计算的原始区块  
    /// # 返回
    /// 包含有效哈希和nonce的区块
    pub fn mine_block(&self, mut block: Block) -> Block {
        // 生成目标前缀字符串（例如难度2为"00"）
        let target = "0".repeat(self.difficulty);
        
        // 暴力搜索nonce值
        while !block.hash.starts_with(&target) {
            block.nonce += 1;           // 递增nonce
            block.hash = block.calculate_hash(); // 重新计算哈希
        }
        block
    }

    /// 验证区块是否满足难度要求
    pub fn is_valid(&self, block: &Block) -> bool {
        block.hash.starts_with(&"0".repeat(self.difficulty))
    }
}

// src/pow.rs
impl Default for ProofOfWork {
    fn default() -> Self {
        Self::new(4)  // 默认难度值
    }
}
